package vistas;

import java.awt.Color;
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.ArrayList;

import javax.swing.*;
import javax.xml.parsers.ParserConfigurationException;

import controlador.Coordinador;
import modelo.Jugador;
import modelo.mapa.*;
import modelo.centrales.*;
import modelo.edificios.*;
import modelo.excepciones.*;
import modelo.mapa.Dimension;
import modelo.mapa.Ubicacion;
import modelo.servicios.*;
import modelo.hectareas.HectareaDeAgua;
import modelo.interfaces.ConstruibleTerrestre;
import modelo.*;


public class Dibujar extends JFrame implements ActionListener,MouseListener{

	private JButton botonPausa,botonMusica,guardar,tuberiaNueva,pozo,mapa,residencial,comercial,industrial,eolica,mineral,nuclear,tension,ruta,bomberos,tuberia,salir,borrarElemento;
	private JLabel ciudadanos,nomDinero,nomCiudadanos,menu,nomTurno,godzilla,informacion;
	private JLabel[][] imagenAnteriorTerrestre,imagenAnteriorSubterraneo;	
	private Ubicacion ubimouse;
	private HerramientasGraficas herramienta=new HerramientasGraficas();
	private ActionEvent elementoConstruir;
	private Coordinador coordinador;
	private String mapaActual,music,pausa;
	private Musica musica;
	private boolean estaEnPausa=false,juegoTerminado=false;
	private final static int VIBRATION_LENGTH = 20;
	private final static int VIBRATION_VELOCITY = 5;

	public Dibujar(Coordinador coordinador)
	{
		godzilla=new JLabel(Vista.getImagenGodzilla());
		this.coordinador=coordinador;
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().setBackground(new Color(22,96,233));
		coordinador.setDibujar(this);
		this.setLayout(null);
		this.addMouseListener(this);		
		musica=new Musica();
		music="Apagar musica";
		botonMusica=herramienta.newButton(music,0 , 32, 128, 32, this);
		pausa="Pausa";
		botonPausa=herramienta.newButton("Pausa", 0, 64, 128, 32, this);
		String infoJugador=this.getInformacion();
		informacion=herramienta.newLabel(infoJugador,0,0,1152,32,this);
		informacion.setFont(new java.awt.Font("Tahoma", 0, 16)); 
		imagenAnteriorTerrestre=new JLabel[coordinador.obtenerTamanioMapa().obtenerCantidadFilas()][coordinador.obtenerTamanioMapa().obtenerCantidadColumnas()];
		imagenAnteriorSubterraneo=new JLabel[coordinador.obtenerTamanioMapa().obtenerCantidadFilas()][coordinador.obtenerTamanioMapa().obtenerCantidadColumnas()];	
	}
	
	public void dibujarMapaPrincipal() 
	{
		if(this.mapaActual != "Principal")
		{
			this.setTitle("AlgoCity - "+this.coordinador.getNombreJugador());
			this.borrar();
			this.add(new JScrollPane());
			this.setBounds(0,0,1280,720);
			this.setVisible(true);
			this.setResizable(false);
			this.ponerMenu();
			this.dibujar();
			this.rePintar();
			this.mapaActual="Principal";
		}				
	}
	
	private void ponerMenu() {
		
		ponerBotones();
		
		
	}
	private String getInformacion() {
		String informacion=coordinador.getNombreJugador();
		informacion+="          Poblacion: "+Integer.toString(coordinador.obtenerCantidadDeCiudadanos());
		informacion+="          Capacidad: "+ Integer.toString(coordinador.obtenerCapacidadDeAlojamientoTotal());
		informacion+="          Dinero: $"+ Integer.toString(coordinador.obtenerDinero());
		informacion+="          Turno: " + Long.toString(coordinador.obtenerCantidadDeTurnos());
		informacion+="          Cap.Trabajo: " + Integer.toString(coordinador.obtenerCapacidadDeTrabajo());
		informacion+="          Felicidad: " + Integer.toString(coordinador.obtenerFelicidad());
		return informacion;
	}
	private void ponerBotones() {
		residencial=herramienta.newButton("Casa",0,128,128,32,this,Vista.getImagenResidencial());
		comercial=herramienta.newButton("Comercial",0,160,128,32,this,Vista.getImagenComercial());		
		industrial=herramienta.newButton("Industrial",0,192,128,32,this,Vista.getImagenIndustrial());
		eolica=herramienta.newButton("Eolica",0,224,128,32,this,Vista.getImagenEolica());
		mineral=herramienta.newButton("Mineral",0,256,128,32,this,Vista.getImagenMineral());
		nuclear=herramienta.newButton("Nuclear",0,288,128,32,this,Vista.getImagenNuclear());
		tension=herramienta.newButton("Linea",0,320,128,32,this,Vista.getImagenLinea());
		ruta=herramienta.newButton("Ruta",0,352,128,32,this,Vista.getImagenRuta());
		bomberos=herramienta.newButton("Bomberos",0,384,128,32,this,Vista.getImagenBomberos());
		pozo=herramienta.newButton("Pozo",0,416,128,32,this,Vista.getImagenPozo());
		tuberia=herramienta.newButton("Ver Tuberia",0,480,128,32,this);
		guardar=herramienta.newButton("Guardar",0,626,128,32,this);
		borrarElemento=herramienta.newButton("Borrar Elemento",0,544,128,32,this);
		salir=herramienta.newButton("Salir",0,658,128,32,this);
		
	}
	
	public void dibujarMapaTuberia() {
		if(this.mapaActual!="Tuberias"){
			this.borrar();
			this.setBounds(0,0,1280,720);
			this.setVisible(true);
			this.setResizable(false);
			this.ponerMenuTuberias();
			this.dibujarTuberias();
			this.rePintar();
			this.mapaActual="Tuberias";
			
		}		
	}
	

	private void ponerMenuTuberias() {
		//menu=herramienta.newLabel("Tuberias",0,0,128,32,this);
		tuberiaNueva=herramienta.newButton("Tuberia",0,128,128,32,this,Vista.getImagenTuberia());
		borrarElemento=herramienta.newButton("Borrar Elemento",0,544,128,32,this);
		mapa=herramienta.newButton("Ver Mapa",0,576,128,32,this);
		salir=herramienta.newButton("Salir",0,658,128,32,this);
	}
	private void dibujarTuberias() {
		this.dibujarPozoDeAgua();
		this.dibujarTierras();
		mapaActual="Tuberias";
		
		
		
	}
	private void dibujarTierras() {
		int i,j;
		Dimension dimensionMapa=coordinador.obtenerTamanioMapa();
		for(i=0;i<dimensionMapa.obtenerCantidadFilas();i++){
			for(j=0;j<dimensionMapa.obtenerCantidadColumnas();j++){
				dibujarTierra(new Ubicacion(i,j));
			}
		}
	}
	private void dibujarTierra(Ubicacion ubicacion) {
		if(imagenAnteriorSubterraneo[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]==null){
			dibujarSubterraneo(Vista.getImagenTierra(),ubicacion);
		}
		
	}
	private void dibujar() {
		this.dibujarContruccionTerrestre();
		this.ponerPastoYAgua();		
		mapaActual="Principal";
	}
	
	

	
	
	private void ponerPastoYAgua() {
		dibujarAgua();
		dibujarPastos();
	}
	private void dibujarPastos() {
		int i,j;
		Dimension dimensionMapa=coordinador.obtenerTamanioMapa();
		for(i=0;i<dimensionMapa.obtenerCantidadFilas();i++){
			for(j=0;j<dimensionMapa.obtenerCantidadColumnas();j++){
				dibujarPasto(new Ubicacion(i,j));
			}
		}		
	}
	private void dibujarPasto(Ubicacion ubicacion) {
		if(imagenAnteriorTerrestre[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]==null){
			dibujarTerrestre(Vista.getImagenPasto(),ubicacion);
		}		
	}
	private void dibujarAgua() {
		ArrayList<HectareaDeAgua>listaAgua=coordinador.obtenerListaDeHectareasDeAgua();
		for(HectareaDeAgua hec:listaAgua){
			if(coordinador.buscarEnMapaPozo(hec.obtenerUbicacion())==null){
				dibujarTerrestre(Vista.getImagenAgua(),hec.obtenerUbicacion());
			}
		}
	}
	private void dibujarPozoDeAgua() {
			ArrayList<PozoDeAgua>listaDePozos=coordinador.obtenerListaPozos();
			for(PozoDeAgua pozo:listaDePozos){
				dibujarSubterraneo(Vista.getImagenPozo(),pozo.obtenerUbicacion());
				dibujarRedesDeAgua(pozo.obtenerRedesDeAgua());
			}
		
	}
	private void dibujarRedesDeAgua(ArrayList<RedDeAgua> redesDeAgua) {
		for(RedDeAgua red:redesDeAgua){
			dibujarRedDeAgua(red);
		}
	}
	private void dibujarRedDeAgua(RedDeAgua red) {
		for(TuberiaDeAgua tub:red.obtenerListaDeTuberias()){
			dibujarSubterraneo(Vista.getImagenTuberia(),tub.obtenerUbicacion());
		}
	}
	private void dibujarSubterraneo(ImageIcon image,Ubicacion ubicacion) {
		borrar(ubicacion);
		JLabel imagen=new JLabel(image);
		imagen.setBounds(transformadorCoordenadas(ubicacion).obtenerCoordenadaX(),transformadorCoordenadas(ubicacion).obtenerCoordenadaY(),32,32);
		imagen.setVisible(true);
		this.add(imagen);
		imagenAnteriorSubterraneo[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]=imagen;	
	}
	private void borrar(Ubicacion ubicacion) {
		if(imagenAnteriorTerrestre[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]!=null){
			imagenAnteriorTerrestre[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()].setVisible(false);
			remove(imagenAnteriorTerrestre[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]);
			imagenAnteriorTerrestre[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]=null;
		}		
		if(imagenAnteriorSubterraneo[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]!=null){
			imagenAnteriorSubterraneo[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()].setVisible(false);
			remove(imagenAnteriorSubterraneo[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]);
			imagenAnteriorSubterraneo[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]=null;
		}		
	}
	
	private void dibujarContruccionTerrestre() {
		dibujarTerrestres();
		dibujarCentralesYLineas();
		dibujarRutas();
		dibujarBomberos();
		dibujarPozos();		
		
	}
	private void dibujarRutas() {
		ArrayList<RutaPavimentada>rutas=coordinador.obtenerListaRutas();
		for(RutaPavimentada ruta:rutas){
			dibujarTerrestre(Vista.getImagen(ruta),ruta.obtenerUbicacion());
		}
	}
	private void dibujarPozos() {
		ArrayList<PozoDeAgua>pozos=coordinador.obtenerListaPozos();
		for(PozoDeAgua pozo:pozos){
			dibujarTerrestre(Vista.getImagenPozo(),pozo.obtenerUbicacion());
		}
		
	}
	private void dibujarBomberos() {
		ArrayList<Bomberos>listaBomberos=coordinador.obtenerListaBomberos();
		for(Bomberos bombero:listaBomberos){
			dibujarTerrestre(Vista.getImagen(bombero),bombero.obtenerUbicacion());
		}
	}
	private void dibujarCentralesYLineas() {
		ArrayList<CentralEolica>centralesEolicas=coordinador.obtenerListaCentralesEolicas();
		ArrayList<CentralMineral>centralesMinerales=coordinador.obtenerListaCentralesMinerales();
		ArrayList<CentralNuclear>centralesNucleares=coordinador.obtenerListaCentralesNucleares();
		
		dibujarCentralesEolicas(centralesEolicas);
		dibujarCentralesMinerales(centralesMinerales);
		dibujarCentralesNucleares(centralesNucleares);		
		
	}
	private void dibujarCentralesMinerales(	ArrayList<CentralMineral> centralesMinerales) {
		for(CentralMineral central:centralesMinerales){
			dibujarTerrestre(Vista.getImagen(central),central.obtenerUbicacion());
			dibujarRedes(central.obtenerRedesElectricas());
		}
		
	}
	private void dibujarCentralesNucleares(	ArrayList<CentralNuclear> centralesNucleares) {
		for(CentralNuclear central:centralesNucleares){
			dibujarTerrestre(Vista.getImagen(central),central.obtenerUbicacion());
			dibujarRedes(central.obtenerRedesElectricas());
		}
		
	}
	private void dibujarCentralesEolicas(ArrayList<CentralEolica> centralesEolicas) {
	for(CentralEolica central:centralesEolicas){
		dibujarTerrestre(Vista.getImagen(central),central.obtenerUbicacion());
		dibujarRedes(central.obtenerRedesElectricas());
	}
		
	
		
	}
	private void dibujarRedes(ArrayList<RedElectrica> RedesElectricas) {
		for(RedElectrica red:RedesElectricas){
			dibujarLineas(red);
		}	
	}
	
	private void dibujarLineas(RedElectrica red) {
			for(LineaDeTension linea:red.obtenerListaDeLineasDeTension()){
				dibujarTerrestre(Vista.getImagen(linea),linea.obtenerUbicacion());
			}
	}
	private void dibujarTerrestres() {
		ArrayList<EdificioResidencial>residenciales=coordinador.obtenerListaEdificiosResidenciales();
		ArrayList<EdificioComercial>comerciales=coordinador.obtenerListaEdificiosComerciales();
		ArrayList<EdificioIndustrial>industriales=coordinador.obtenerListaEdificiosIndustriales();		
		dibujarTerrestresResidenciales(residenciales);
		dibujarTerrestresComerciales(comerciales);
		dibujarTerrestresIndustriales(industriales);
		
	}
	private void dibujarTerrestresIndustriales(
			ArrayList<EdificioIndustrial> industriales) {
		for(EdificioIndustrial edif:industriales){
			dibujarTerrestre(Vista.getImagen(edif),edif.obtenerUbicacion());
		}	
		
	}
	private void dibujarTerrestresComerciales(ArrayList<EdificioComercial> comerciales) {
		for(EdificioComercial edif:comerciales){
			dibujarTerrestre(Vista.getImagen(edif),edif.obtenerUbicacion());
		}		
	}
	private void dibujarTerrestresResidenciales(ArrayList<EdificioResidencial> residenciales) {
		for(EdificioResidencial edif:residenciales){
			if(edif!=null){
				dibujarTerrestre(Vista.getImagen(edif),edif.obtenerUbicacion());
			}			
		}
	}
	private void dibujarTerrestre(ImageIcon image, Ubicacion ubicacion) {
		borrar(ubicacion);
		JLabel imagen=new JLabel(image);
		imagen.setBounds(transformadorCoordenadas(ubicacion).obtenerCoordenadaX(),transformadorCoordenadas(ubicacion).obtenerCoordenadaY(),32,32);
		imagen.setVisible(true);
		this.add(imagen);
		imagenAnteriorTerrestre[ubicacion.obtenerCoordenadaX()][ubicacion.obtenerCoordenadaY()]=imagen;	
		
	}
	
	private void borrar() {
		int i,j;
		for(i=0;i<Mapa.getInstance().obtenerCantidadFilas();i++){
			for(j=0;j<Mapa.getInstance().obtenerCantidadColumnas();j++){
				if(imagenAnteriorTerrestre[i][j]!=null){
					imagenAnteriorTerrestre[i][j].setVisible(false);
					remove(imagenAnteriorTerrestre[i][j]);
					imagenAnteriorTerrestre[i][j]=null;
				}
				if(imagenAnteriorSubterraneo[i][j]!=null){
					imagenAnteriorSubterraneo[i][j].setVisible(false);
					remove(imagenAnteriorSubterraneo[i][j]);
					imagenAnteriorSubterraneo[i][j]=null;
				}
			}
		}
		borrarBotones();
		
		
	}
	private void borrarBotones() {
		herramienta.remover(residencial,this);
		herramienta.remover(mapa,this);
		herramienta.remover(comercial,this);
		herramienta.remover(industrial,this);
		herramienta.remover(eolica,this);
		herramienta.remover(mineral,this);
		herramienta.remover(nuclear,this);
		herramienta.remover(tension,this);
		herramienta.remover(ruta,this);
		herramienta.remover(bomberos,this);
		herramienta.remover(pozo,this);
		herramienta.remover(tuberia,this);
		herramienta.remover(salir,this);
		herramienta.remover(tuberiaNueva,this);
		herramienta.remover(menu,this);
		//herramienta.remover(nomCiudadanos,this);
		herramienta.remover(ciudadanos,this);
		herramienta.remover(nomDinero,this);
		herramienta.remover(guardar,this);
		herramienta.remover(borrarElemento,this);
		
	}
	
	public void reDibujarMapaPrincipal() {
		this.actualizarDineroYPoblacio();
		this.dibujar();
		this.rePintar();
		
	}
	private void reDibujarMapaTuberias() {
		this.dibujarTuberias();
		this.rePintar();			
	}
	private void esperarMouse(ActionEvent e){
		elementoConstruir=e;
	}
	private void realizarElemento(){
	try{
		if(estaEnPausa==false){
			if (elementoConstruir.getSource()==residencial) {
				coordinador.edificarEdificioResidencial(ubimouse);
				this.reDibujarMapaPrincipal();
			}
			if (elementoConstruir.getSource()==comercial) {
				coordinador.edificarEdificioComercial(ubimouse);
				this.reDibujarMapaPrincipal();
			}
			if (elementoConstruir.getSource()==industrial) {
				coordinador.edificarEdificioIndustrial(ubimouse);
				this.reDibujarMapaPrincipal();
			}
			if (elementoConstruir.getSource()==eolica) {
				coordinador.edificarCentralEolica(ubimouse);
				this.reDibujarMapaPrincipal();
			}            
			if (elementoConstruir.getSource()==mineral) {
				coordinador.edificarCentralMineral(ubimouse);
				this.reDibujarMapaPrincipal();
			}
			if (elementoConstruir.getSource()==nuclear) {
				coordinador.edificarCentralNuclear(ubimouse);
				this.reDibujarMapaPrincipal();
			}
			if (elementoConstruir.getSource()==tension) {
				try{
					coordinador.edificarRedElectrica(ubimouse);	
					this.reDibujarMapaPrincipal();
				}catch(NoSePudoComenzarLaRedDeLineasDeTensionPorqueNoHayUnaCentralLimitrofeException e1){
					JOptionPane.showMessageDialog(this, "No Hay una central limitrofe!");
				}		
			}			
			if (elementoConstruir.getSource()==ruta) {
				coordinador.crearRutaPavimentada(ubimouse);
				this.reDibujarMapaPrincipal();
			}
			if (elementoConstruir.getSource()==bomberos) {
				coordinador.edificarBomberos(ubimouse);
				this.reDibujarMapaPrincipal();
			}
			if (elementoConstruir.getSource()==pozo) {
				try{
					coordinador.edificarPozoDeAgua(ubimouse);
					this.reDibujarMapaPrincipal();
				}catch(NoSePuedeConstruirElObjetoDeseadoEnUnaHectareaTerrestreException e){
					JOptionPane.showMessageDialog(this, "No se puede construir un pozo de agua en una hectarea terrestre!");
				}catch(YaHayUnPozoDeAguaEnLaUbicacionDeseadaException e2){
					JOptionPane.showMessageDialog(this, "Ya hay una construccion");
				}
  			}
			if (elementoConstruir.getSource()==tuberiaNueva) {
				try {
					coordinador.edificarTuberia(ubimouse);
				}catch(NoSePudoComenzarLaRedDeTuberiasDeAguaPorqueNoHayUnPozoDeAguaLimitrofeException e) {
					Toolkit.getDefaultToolkit().beep();
					JOptionPane.showMessageDialog(this, "No hay pozo de aguaLimitrofe y tampoco no hay tuberia limitrofe");
				}
				this.reDibujarMapaTuberias();
			}
		}
		}catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException E){
			Toolkit.getDefaultToolkit().beep();
			JOptionPane.showMessageDialog(this, "No hay Suficiente Dindero");
		}catch(NoSePuedeConstruirElObjetoDeseadoEnUnaHectareaDeAguaException E){
			Toolkit.getDefaultToolkit().beep();
			JOptionPane.showMessageDialog(this, "No Se puede contruir en el agua");
		}catch(YaHayUnaConstruccionTerrestreEnLaUbicacionDeseadaException e3){
			Toolkit.getDefaultToolkit().beep();
			JOptionPane.showMessageDialog(this, "Ya hay una construccion En en lugar");
		}
		if (elementoConstruir.getSource() == borrarElemento)
		{
			try
			{
				if(this.mapaActual == "Principal")
				{
					coordinador.borrarElemento(ubimouse);
					herramienta.remover(imagenAnteriorTerrestre[ubimouse.obtenerCoordenadaX()][ubimouse.obtenerCoordenadaY()], this);
  	  				imagenAnteriorTerrestre[ubimouse.obtenerCoordenadaX()][ubimouse.obtenerCoordenadaY()]=null;
  	  				this.reDibujarMapaPrincipal();
  				}
				else
				{
  					coordinador.borrarElementoSubterraneo(ubimouse);
  					herramienta.remover(imagenAnteriorSubterraneo[ubimouse.obtenerCoordenadaX()][ubimouse.obtenerCoordenadaY()], this);
  	  	  			imagenAnteriorSubterraneo[ubimouse.obtenerCoordenadaX()][ubimouse.obtenerCoordenadaY()]=null;
  	  	  			this.reDibujarMapaTuberias();
  				}
  			}catch(NoHayNadaQueEliminarException e1){JOptionPane.showMessageDialog(this, "No hay nada que borrar");}
		}
	}
	
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==botonMusica){
			musica.alternarMusica();
			if(music=="Apagar musica"){
				music="Prender Musica";
				botonMusica.setText(music);
			}else{
				music="Apagar musica";
				botonMusica.setText(music);
			}
			this.rePintar();
		}
		if (e.getSource()==salir) {
			Object[] options = { "Guardar y salir", "Salir" };
            int opcion=JOptionPane.showOptionDialog(null, "Desea guardar antes de salir", "Aviso",JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,null, options, options[0]);
  			//0 es Guardar y salir, 1 es Salir
            if(opcion==0){
            		try {
            			coordinador.guardarPartida();
            			JOptionPane.showMessageDialog(this, "Se guardo la partida: "+ coordinador.getNombreJugador());
            		} catch (IOException e1) {
            			JOptionPane.showMessageDialog(this, "Error en la escritura");
            		}
            }
            musica.pausar();
            this.borrar();
            juegoTerminado=true;
  			this.setVisible(false);
  			coordinador.verPantallaPrincipal();
		}
  		if (e.getSource()==tuberia) {
  			this.dibujarMapaTuberia();
		}
  		if (e.getSource()==mapa) {
  			this.dibujarMapaPrincipal();
		}
  		if (e.getSource()==guardar) {
  			try {
				coordinador.guardarPartida();
				JOptionPane.showMessageDialog(this, "Se guardo la partida: "+ coordinador.getNombreJugador());
			} catch (IOException e1) {
				JOptionPane.showMessageDialog(this, "Error en la escritura");
			}
  			
		}
  		if(e.getSource()==botonPausa){
  			if(estaEnPausa==true){
  				pausa="Pausar";
  				estaEnPausa=false;
  			}else{
				pausa="Continuar";
				estaEnPausa=true;
			}
  			botonPausa.setText(pausa);
  		}
  		this.esperarMouse(e);		
	}

	public void actualizarDineroYPoblacio() {
		String info=this.getInformacion();
		informacion.setText(info);
	}
	/*public void actualizarTurno(){
		String turno=Long.toString(this.coordinador.obtenerCantidadDeTurnos());
		nomTurno.setText(turno);
		this.rePintar();
	}*/
	public void mouseClicked(MouseEvent arg0) {
		int x=(int)((arg0.getX()-128)/32.0);
		int y=(int)(((arg0.getY()-25-32)/32.0));//el 25 es el borde
		if(x>=0 && y>=0){
			ubimouse=new Ubicacion(x,y);
			realizarElemento();
		}
		
		
		
	}
	public void mouseEntered(MouseEvent arg0) {
		//no hace nada me obliga a redefirirlo para usar el mouse clicked
	}
	public void mouseExited(MouseEvent arg0) {
		//no hace nada me obliga a redefirirlo para usar el mouse clicked
		
	}
	public void mousePressed(MouseEvent arg0) {
		//no hace nada me obliga a redefirirlo para usar el mouse clicked
		
	}
	public void mouseReleased(MouseEvent arg0) {
		//no hace nada me obliga a redefirirlo para usar el mouse clicked
	}
	private Ubicacion transformadorCoordenadas(Ubicacion ubicacion){
		int x=ubicacion.obtenerCoordenadaX()*32+128;
		if(ubicacion.obtenerCoordenadaX()>=0 && ubicacion.obtenerCoordenadaX()<coordinador.obtenerTamanioMapa().obtenerCantidadFilas()){
			int y=ubicacion.obtenerCoordenadaY()*32+32;
			if(ubicacion.obtenerCoordenadaY()>=0 && ubicacion.obtenerCoordenadaY()<coordinador.obtenerTamanioMapa().obtenerCantidadColumnas()){
				return new Ubicacion(x,y);
			}
			else{
				return null;
			}
		}else{
			return null;
		}
		
		
	}
	public void reDibujarMapa() {
		if(mapaActual=="Principal"){
			this.reDibujarMapaPrincipal();
		}
		else{
			this.reDibujarMapaTuberias();
		}
	}
	
	public void afectoGodzilla() 
	{		
		borrarCaminoGodzilla(coordinador.getGodzillaCamino());
		if(this.mapaActual == "Principal")
		{
			this.ponerPastoYAgua();
			this.mostrarCamninoGodzilla(coordinador.getGodzillaCamino());	
		}		
		JOptionPane.showMessageDialog(this, "La ciudad Fue afectada por Godzilla");		
	}	
		
	private void borrarCaminoGodzilla(ArrayList<Ubicacion> godzillaCamino) {
		for(Ubicacion ubi:godzillaCamino){
			if(ubi.obtenerCoordenadaX()<coordinador.obtenerTamanioMapa().obtenerCantidadFilas() && ubi.obtenerCoordenadaY()<coordinador.obtenerTamanioMapa().obtenerCantidadColumnas()){
				//System.out.println(Integer.toString(ubi.obtenerCoordenadaX())+"/"+Integer.toString(ubi.obtenerCoordenadaY()));
				herramienta.remover(imagenAnteriorTerrestre[ubi.obtenerCoordenadaX()][ubi.obtenerCoordenadaY()],this);
				imagenAnteriorTerrestre[ubi.obtenerCoordenadaX()][ubi.obtenerCoordenadaY()]=null;
				
			}
			
		}
		//this.rePintar();
	}
	private void mostrarCamninoGodzilla(ArrayList<Ubicacion> godzillaCamino)
	{
		JButton tub = tuberia;//anula la tuberia
		tuberia = null;
		for(Ubicacion ubicacion : godzillaCamino)
		{
			this.mostrarGodzilla(ubicacion);
			try 
			{ 
				Thread.sleep(250);
				this.actualizarDineroYPoblacio();
			} catch (InterruptedException e) {/*por el thread te obliga a ponerlo*/}
			this.quitarGodzilla(ubicacion);			
		}		
		tuberia=tub;
	}
	
	private void quitarGodzilla(Ubicacion ubi) 
	{
		herramienta.remover(godzilla,this);
		Ubicacion ubicacionFrame;
		ubicacionFrame=this.transformadorCoordenadas(ubi);
		JLabel imActual=imagenAnteriorTerrestre[ubi.obtenerCoordenadaX()][ubi.obtenerCoordenadaY()];
		if(this.mapaActual == "Principal")
		{
			this.add(imActual);
			imActual.setVisible(true);	
			this.rePintar();
		}

	}
	
	private void mostrarGodzilla(Ubicacion ubi)
	{
		Ubicacion ubicacionBorrar;
		JLabel imActual = imagenAnteriorTerrestre[ubi.obtenerCoordenadaX()][ubi.obtenerCoordenadaY()];
		herramienta.remover(imActual,this);
		Ubicacion ubiFrame=transformadorCoordenadas(ubi);
		if( (this.mapaActual == "Principal") && (ubiFrame != null) )
		{
			godzilla.setBounds(ubiFrame.obtenerCoordenadaX(),ubiFrame.obtenerCoordenadaY(),32,32);
			this.add(godzilla);
			godzilla.setVisible(true);
			this.rePintar();
		}		
	}
	
	private void rePintar()
	{
		try
		{
			this.repaint();
		}catch(java.lang.ArrayIndexOutOfBoundsException e1){}		
	}
	
	private Ubicacion transformadorUbicacionGodzilla(Ubicacion ubi, int i, int j) {
		if(ubi.obtenerCoordenadaX()+i<coordinador.obtenerTamanioMapa().obtenerCantidadFilas()){
			if(ubi.obtenerCoordenadaY()+j<coordinador.obtenerTamanioMapa().obtenerCantidadColumnas()){
				return new Ubicacion(ubi.obtenerCoordenadaX()+i,ubi.obtenerCoordenadaY()+j);
			}
		}
		return null;
		
	}
	private void vivrarPantalla() {
		final int originalX = this.getLocationOnScreen().x; 
	    final int originalY = this.getLocationOnScreen().y; 
		for(int i = 0; i < VIBRATION_LENGTH; i++) { 
	        try {
				Thread.sleep(10);
				this.setLocation(originalX, originalY + VIBRATION_VELOCITY); 
				Thread.sleep(10); 
				this.setLocation(originalX, originalY - VIBRATION_VELOCITY);
				Thread.sleep(10); 
				this.setLocation(originalX + VIBRATION_VELOCITY, originalY);
				Thread.sleep(10); 
				this.setLocation(originalX, originalY); 
	        } catch (InterruptedException e) {
				// Me obliga a ponerlo por el thread.sleep
				
			} 
	      } 				
	}
	public void afectoTerremoto() {
		this.vivrarPantalla();
		JOptionPane.showMessageDialog(this, "La ciudad Fue afectada por un Terremoto");			
	}
	public boolean estaPausado() {
		return this.estaEnPausa;
	}
	public boolean juegoTerminado() {
		return juegoTerminado;
	}
}